home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / grafica / amhelios / hc_clip.cpp < prev    next >
C/C++ Source or Header  |  1999-01-01  |  5KB  |  177 lines

  1. ////////////////////////////////////////////////////////////
  2. //
  3. //  HC_CLIP.CPP - Hemicube Polygon Clipper Class
  4. //
  5. //  Version:    1.03A
  6. //
  7. //  History:    94/08/23 - Version 1.00A release.
  8. //              94/12/16 - Version 1.01A release.
  9. //              95/02/05 - Version 1.02A release.
  10. //              95/07/21 - Version 1.02B release.
  11. //              96/02/14 - Version 1.02C release.
  12. //              96/04/01 - Version 1.03A release.
  13. //
  14. //  Compilers:  Microsoft Visual C/C++ Professional V1.5
  15. //              Borland C++ Version 4.5
  16. //
  17. //  Author:     Ian Ashdown, P.Eng.
  18. //              byHeart Software Limited
  19. //              620 Ballantree Road
  20. //              West Vancouver, B.C.
  21. //              Canada V7S 1W3
  22. //              Tel. (604) 922-6148
  23. //              Fax. (604) 987-7621
  24. //
  25. //  Copyright 1994-1996 byHeart Software Limited
  26. //
  27. //  The following source code has been derived from:
  28. //
  29. //    Ashdown, I. 1994. Radiosity: A Programmer's
  30. //    Perspective. New York, NY: John Wiley & Sons.
  31. //
  32. //  It may be freely copied, redistributed, and/or modified
  33. //  for personal use ONLY, as long as the copyright notice
  34. //  is included with all source code files.
  35. //
  36. ////////////////////////////////////////////////////////////
  37.  
  38. #include "hc_clip.h"
  39.  
  40. HemiClip::HemiClip()    // HemiClip class constructor
  41. {
  42.   Vector4 temp;     // Temporary vector
  43.  
  44.   // Link edge-plane clippers
  45.   pclip = &(clipper[HC_Front]);
  46.   clipper[HC_Front].Add(&(clipper[HC_Left]));
  47.   clipper[HC_Left].Add(&(clipper[HC_Right]));
  48.   clipper[HC_Right].Add(&(clipper[HC_Top]));
  49.   clipper[HC_Top].Add(&(clipper[HC_Bottom]));
  50.   clipper[HC_Bottom].Add(NULL);
  51.  
  52.   // Set clipper plane normals
  53.  
  54.   temp = Vector4(0.0, 0.0, 1.0, 0.0);
  55.   clipper[HC_Front].SetNormal(temp.Norm());
  56.  
  57.   temp = Vector4(1.0, 0.0, 0.0, 0.0);
  58.   clipper[HC_Left].SetNormal(temp.Norm());
  59.  
  60.   temp = Vector4(-1.0, 0.0, 0.0, 1.0);
  61.   clipper[HC_Right].SetNormal(temp.Norm());
  62.  
  63.   temp = Vector4(0.0, -1.0, 0.0, 1.0);
  64.   clipper[HC_Top].SetNormal(temp.Norm());
  65.  
  66.   temp = Vector4(0.0, 1.0, 0.0, 0.0);
  67.   clipper[HC_Bottom].SetNormal(temp.Norm());
  68. }
  69.  
  70. // Choose random hemicube orientation
  71. void HemiClip::SetView( Patch3 *ppatch )
  72. {
  73.   Vector3 rv;   // Random vector
  74.  
  75.   // Get eye position (hemicube center)
  76.   center = ppatch->GetCenter();
  77.  
  78.   // Select random vector for hemicube orientation
  79.   rv = RandomVector();
  80.  
  81.   n = ppatch->GetNormal();      // Get patch normal
  82.  
  83.   do   // Get valid u-axis vector
  84.   {
  85.     u = Cross(n, rv);
  86.   }
  87.   while (u.Length() < MIN_VALUE);
  88.  
  89.   u.Norm();             // Normalize u-axis
  90.   v = Cross(u, n);      // Determine v-axis
  91. }
  92.  
  93. void HemiClip::BuildTransform( Vector3 &nu, Vector3 &nv,
  94.     Vector3 &nn)
  95. {
  96.   Vector3 origin;       // View space origin
  97.  
  98.   origin = Vector3(center);
  99.  
  100.   // Set view transformation matrix
  101.   vtm[0][0] = nu.GetX();
  102.   vtm[0][1] = nu.GetY();
  103.   vtm[0][2] = nu.GetZ();
  104.   vtm[0][3] = -(Dot(origin, nu));
  105.  
  106.   vtm[1][0] = nv.GetX();
  107.   vtm[1][1] = nv.GetY();
  108.   vtm[1][2] = nv.GetZ();
  109.   vtm[1][3] = -(Dot(origin, nv));
  110.  
  111.   vtm[2][0] = nn.GetX();
  112.   vtm[2][1] = nn.GetY();
  113.   vtm[2][2] = nn.GetZ();
  114.   vtm[2][3] = -(Dot(origin, nn));
  115.  
  116.   vtm[3][0] = 0.0;
  117.   vtm[3][1] = 0.0;
  118.   vtm[3][2] = 0.0;
  119.   vtm[3][3] = 1.0;
  120.  
  121.   // Premultiply by translation matrix
  122.   vtm[2][3] -= 1.0;
  123.  
  124.   // Premultiply by perspective transformation matrix
  125.   vtm[3][0] += vtm[2][0];
  126.   vtm[3][1] += vtm[2][1];
  127.   vtm[3][2] += vtm[2][2];
  128.   vtm[3][3] += vtm[2][3];
  129.  
  130.   // Premultiply by normalization matrix
  131.  
  132.   vtm[0][0] = 0.5 * (vtm[0][0] + vtm[3][0]);
  133.   vtm[0][1] = 0.5 * (vtm[0][1] + vtm[3][1]);
  134.   vtm[0][2] = 0.5 * (vtm[0][2] + vtm[3][2]);
  135.   vtm[0][3] = 0.5 * (vtm[0][3] + vtm[3][3]);
  136.  
  137.   vtm[1][0] = 0.5 * (vtm[1][0] + vtm[3][0]);
  138.   vtm[1][1] = 0.5 * (vtm[1][1] + vtm[3][1]);
  139.   vtm[1][2] = 0.5 * (vtm[1][2] + vtm[3][2]);
  140.   vtm[1][3] = 0.5 * (vtm[1][3] + vtm[3][3]);
  141.  
  142.   vtm[2][0] = SN * vtm[2][0] + RN * vtm[3][0];
  143.   vtm[2][1] = SN * vtm[2][1] + RN * vtm[3][1];
  144.   vtm[2][2] = SN * vtm[2][2] + RN * vtm[3][2];
  145.   vtm[2][3] = SN * vtm[2][3] + RN * vtm[3][3];
  146. }
  147.  
  148. // Update hemicube view transformation matrix
  149. void HemiClip::UpdateView( int face_id )
  150. {
  151.   Vector3 nu, nv, nn;   // View space co-ordinates
  152.  
  153.   switch (face_id )     // Exchange co-ordinates
  154.   {
  155.     case HC_TopFace:
  156.       nu = u; nv = v; nn = n;
  157.       break;
  158.     case HC_FrontFace:
  159.       nu = -u; nv = n; nn = v;
  160.       break;
  161.     case HC_RightFace:
  162.       nu = v; nv = n; nn = u;
  163.       break;
  164.     case HC_BackFace:
  165.       nu = u; nv = n; nn = -v;
  166.       break;
  167.     case HC_LeftFace:
  168.       nu = -v; nv = n; nn = -u;
  169.       break;
  170.     default:
  171.       break;
  172.   }
  173.   
  174.   // Build new view transformation matrix
  175.   BuildTransform(nu, nv, nn);
  176. }
  177.